#include "stm32f10x.h"

void Encoder2_Init(void) {
    // 1.RCC
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 2.GPIO
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 时钟源
    // TIM_InternalClockConfig(TIM3);

    // 3.时基单元
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    // TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 0xFFFF; // ARR，防止溢出，给一个最大值 0xffff(65535)
    TIM_TimeBaseInitStructure.TIM_Prescaler = 0; // PSC
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);
    // 4. 输入捕获
    TIM_ICInitTypeDef TIM_ICInitStructure;
    TIM_ICStructInit(&TIM_ICInitStructure); // 给结构体赋初始值
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; // 通道
    TIM_ICInitStructure.TIM_ICFilter = 0xF; // 滤波器
    // TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 边沿检测极性选择（此处只表示高低电平不翻转）
    // TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 分频器（不分频）
    // TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直连通道/交叉通道
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; // 通道
    TIM_ICInitStructure.TIM_ICFilter = 0xF; // 滤波器
    // TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 边沿检测极性选择（此处只表示高低电平不翻转）
    // TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; // 分频器（不分频）
    // TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 边沿检测极性选择（此处只表示高低电平不翻转）
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
    // 5. 编码器接口模式
    TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);
    // 6. 启动定时器
    TIM_Cmd(TIM3, ENABLE);
}

int16_t Encoder2_Get(void) {
    int16_t Temp = 0;
    Temp = TIM_GetCounter(TIM3);
    TIM_SetCounter(TIM3, 0);
    return Temp;
}
